package com.telcordia.cvas.rpn;

public class RpnCalculator {
	private OperandStack values = new OperandStack();
	private OperatorFactory operatorFactory;
	private boolean insertBeforeSet;

	public RpnCalculator() {
		operatorFactory = new OperatorFactory();
	}
	
	public RpnCalculator(OperatorFactory factory) {
		operatorFactory = factory;
	}
	
	public int getXRegister() {
		return values.peek();
	}

	public void setXRegister(int value) {
		if(insertBeforeSet) {
			enter();
			insertBeforeSet = false;
		}
		
		values.replaceTop(value);
	}

	public void enter() {
		values.push(getXRegister());
	}

	public void perform(String operatorName) {
		Operator op = operatorFactory.findOperatorNamed(operatorName);
		op.execute(values);
		insertBeforeSet = true;
	}

	public int[] getStack() {
		return values.getStack();
	}

	public Operator getOperatorNamed(String operatorName) {
		return operatorFactory.findOperatorNamed(operatorName);
	}

	public void addOperatorNamed(CompositeMathOperator op, String operatorName) {
		operatorFactory.addOperatorNamed(op, operatorName);
	}
}
